import traceback
import pyautogui
import os
import time
import pyperclip as clip
import json
import pandas as pd
from datetime import datetime
from sqlalchemy import create_engine
import pypinyin
from bs4 import BeautifulSoup
import random
from jsjj.util.configUtil import *
from jsjj.email.sendEmail import *
from jsjj.util.dbUtil import *
from jsjj.util.emailUtil import *
from jsjj.util.logUtil import *
from jsjj.util.timeUtil import *
from jsjj.util.dirUtil import *
from jsjj.util.mouseMoveUtil import *

runMode = '日模式'  # 只有日模式，因为返回的数据，都是以月数据返回的，因此不存在真正的周和月模式
# 拼多多-商家后台-数据中心-服务数据-领航员
modeName = '拼多多_商家后台_多多客服_客服数据'

downloadFilePath = getdownloadFilePath()


# 左边点击，直到点击到一级类目，该过程不参与循环
def SPGK(engine, conn):
    # 关闭电霸每天晚上会弹出的一个屏蔽页面
    pyautogui.FAILSAFE = False

    sleep(6)
    pyautogui.scroll(10000)
    # 左边--【物流工具】
    viaCommonUrl('https://mms.pinduoduo.com/orders/order/carriage/list')

    # 避免反复的脏数据，因此一开始也需要进行删除的
    deleteExtendFile('*.xls')

    # 左边--【客服数据】
    viaCommonUrl('https://mms.pinduoduo.com/mms-chat/overview/store')

    pyautogui.moveTo(1264, 217, 4)
    pyautogui.click()

    sleep(2)
    pyautogui.keyDown('f12')
    pyautogui.keyUp('f12')
    sleep(2)

    jsonFromWebShopName = getSjhtShopName()

    pyautogui.moveTo(1420, 534, 6)
    pyautogui.click()

    # 下载多多客服的相关数据
    pyautogui.scroll(-1000)

    # 我们只取前30天的，因为本省的数据就是以天纬度的返回，没有进行数据汇总的
    pyautogui.moveTo(441, 429, 4)
    pyautogui.click()

    # 点击进30天
    pyautogui.moveTo(557, 470, 4)
    pyautogui.click()

    # 点下载表单 按钮
    pyautogui.moveTo(1342, 430, 4)
    pyautogui.click()

    # 这里点击下载文件，因此要等一下
    sleep(8)

    # 空白区域点击一下
    pyautogui.moveTo(1410, 471, 2)
    pyautogui.click()

    resetGuiAtLastStepCloseF12ToTop()

    # 入库从浏览器下载的excel文件（这里只是入库了一个文件）
    return jsonFromWebShopName['result']['username']


def saveFilesToMysql(shopName, conn):
    sleep(10)
    # # 到这里，文件已经全部截取下来了，挨个处理文件入库
    filelist = getRawFileList(downloadFilePath)
    for file in filelist[0]:
        if "店铺统计数据" in file:
            df = pd.read_excel(file, sheet_name=0)
            df = df.dropna(axis=0, how='all')
            # 部分列按照常规的命名规范
            df.rename(columns={'日期': 'statDate', '客服销售额(元)': '客服销售额元', '平均响应时长(分)': '平均响应时长分'}, inplace=True)
            df['shopName'] = shopName
            df['导入文件名称'] = file.split('\\')[1]
            df['插入时间'] = datetime.datetime.now()
            df['运行模式'] = runMode
            df['统计月'] = df['statDate'].apply(lambdaGetMonth)
            df['统计周'] = df['statDate'].apply(lambdaGetWeek)
            df['统计日'] = df['statDate']
            df['统计日周月'] = ''
            if runMode == '日模式':
                df['统计日周月'] = df['统计日']
            elif runMode == '周模式':
                df['统计日周月'] = df['统计周']
            elif runMode == '月模式':
                df['统计日周月'] = df['统计月']
            # 解决可能出现的超时问题bugfix 2020.08.18（）
            conn.connection.connection.ping(reconnect=True)
            df.to_sql(name=modeName, con=conn, if_exists='append', index=False)

    # 全部保存成功了，这里就应该删除本批次的文件，避免和其他批次混起来
    deleteExtendFile('*.xls')


def lambdaGetWeek(statDateStr):
    return getWeekOfYear(int(statDateStr.split("-")[0]), int(statDateStr.split("-")[1]), int(statDateStr.split("-")[2]))


def lambdaGetMonth(statDateStr):
    return str(int(statDateStr.split("-")[1])) + "月"


def deleteDuplicationData(engine):
    # 这里有特殊的逻辑，不同账号，可能有相同的类目，同一天的数据，是一模一样的，因此我们需要去除重复数据的
    # 拼多多_商家后台_交易数据
    sql = 'delete from a                                                              '
    sql += '    using ' + modeName + ' as a, ' + modeName + ' as b   '
    sql += '    where (a.id < b.id)                                                    '
    sql += '    and (a.statDate = b.statDate and  a.shopName = b.shopName)     '
    engine.execute(sql)


def executeCatchWeb(engine, conn):
    try:
        LogTaskAndMachine(modeName, engine, conn, '', runMode)
        shopName = SPGK(engine, conn)
        saveFilesToMysql(shopName, conn)
        deleteDuplicationData(engine)
    except Exception as e:
        traceback.print_exc()
        sendAlert('【异常中断】' + modeName, '异常:' + str(e) + '|报错文件:' + os.path.split(__file__)[-1], engine, conn)
        print('【异常中断】' + modeName, '异常:' + str(e) + '|报错文件:' + os.path.split(__file__)[-1])
        return
    sendFinalSuccessEmail('●正常完成●' + modeName, '', engine, conn, modeName, runMode)


if __name__ == '__main__':
    # 连接database
    engine, conn = getConn()
    executeCatchWeb(engine, conn)
